package co.edu.udea.herbario.dao.impl;

import co.edu.udea.herbario.dao.Conexion;
import co.edu.udea.herbario.dao.EjemplarDao;
import co.edu.udea.herbario.dto.Ejemplar;
import co.edu.udea.herbario.dto.Familia;
import co.edu.udea.herbario.dto.Genero;
import co.edu.udea.herbario.dto.Especie;
import co.edu.udea.herbario.exception.OrgSistemasDaoException;
import co.edu.udea.herbario.util.ConstantesStatic;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

/**
 *Esta clase contiene la implementacion de los metodos planteados en la interface 
 * EjemplarDao,los cuales son utilizados para gestionar los datos de persistencia
 * asociados a los ejemplares registrados en el sistema
 *
 * @author Lorena Orozco
 */
public class EjemplarDaoImp implements EjemplarDao
{
    ResourceBundle consultasSQL;    //variable para obtener las consultas sql del archivo de propiedades
    Connection con = null;          //variable para establecer la conexion con la BD
    CallableStatement cs = null;    //variable para hacer el llamado a las funciones en la BD
    ResultSet rs = null;            //variable donde se retorna el resultado de las consultas realizadas a la BD

    public EjemplarDaoImp()
    {
        consultasSQL = ResourceBundle.getBundle(ConstantesStatic.PROPERTIES_CONSULTAS);
        con = Conexion.obtenerInstancia().abrirConexion();
    }

    public Ejemplar obtenerEjemplar(int id)
    {
        Ejemplar ejem = new Ejemplar();       

        try
        {
            String consulta = consultasSQL.getString("obtenerEjemplar");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(id > 0)
            {
                cs.setInt(1, id);
            }
            else
            {
                return ejem;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while (rs.next())
                {
                    Familia familiadto = new Familia();
                    familiadto.setCodigo(rs.getInt("codigoFamilia"));
                    familiadto.setNombre(rs.getString("nombreFamilia"));
                    familiadto.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    Genero generodto = new Genero();
                    generodto.setCodigo(rs.getInt("codigoGenero"));
                    generodto.setNombre(rs.getString("nombreGenero"));
                    generodto.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    generodto.setFamilia(familiadto);                

                    Especie especiedto = new Especie();
                    especiedto.setCodigo(rs.getInt("codigoEspecie"));
                    especiedto.setNombre(rs.getString("nombreEspecie"));
                    especiedto.setFechaIngreso(rs.getDate("fechaIngresoEspecie"));
                    especiedto.setGenero(generodto);              

                    String autor = rs.getString("nombreautor");
                    String nombreCientifico = rs.getString("nombreGenero") + " " + rs.getString("nombreEspecie") + " " + autor;

                    ejem.setNumero(rs.getInt("numero"));
                    ejem.setFamilia(familiadto);
                    ejem.setGenero(generodto);
                    ejem.setEspecie(especiedto);
                    ejem.setContinente(rs.getInt("continente"));
                    ejem.setPais(rs.getInt("pais"));
                    ejem.setDepartamento(rs.getInt("departamento"));
                    ejem.setMunicipio(rs.getInt("municipio"));
                    ejem.setNombreAutor(autor);
                    ejem.setFechaDeterminacion(rs.getString("fechadeterminacion"));
                    ejem.setNombreDeterminador(rs.getString("nombredeterminador"));
                    ejem.setNombreColectorPrincipal(rs.getString("nombrecolectorppal"));
                    ejem.setNumeroColeccion(rs.getString("numerocoleccion"));
                    ejem.setFechaColeccion(rs.getString("fechacoleccion"));
                    ejem.setNotasCampo(rs.getString("notascampo"));
                    ejem.setSubespecie(rs.getString("subespecie"));
                    ejem.setVariedad(rs.getString("variedad"));
                    ejem.setNombreComun(rs.getString("nombrecomun"));
                    ejem.setNombreCientifico(nombreCientifico);
                    ejem.setLocalidad(rs.getString("localidad"));
                    ejem.setElevacionMinima(rs.getInt("elevacionminima"));
                    ejem.setElevacionMaxima(rs.getInt("elevacionmaxima"));
                    ejem.setGradosLatitud(rs.getDouble("gradoslatitud"));
                    ejem.setMinutosLatitud(rs.getDouble("minutoslatitud"));
                    ejem.setSegundosLatitud(rs.getDouble("segundoslatitud"));
                    ejem.setGradosLongitud(rs.getDouble("gradoslongitud"));
                    ejem.setMinutosLongitud(rs.getDouble("minutoslongitud"));
                    ejem.setSegundosLongitud(rs.getDouble("segundoslongitud"));
                    ejem.setNorteSur(rs.getString("nortesur"));
                    ejem.setEsteOeste(rs.getString("esteoeste"));
                    ejem.setPublicarCoordenadas(rs.getString("publicarcoordenadas"));
                    ejem.setTieneImagen(rs.getString("tieneImagen"));
                    ejem.setPaisTexto(rs.getString("paistxt"));
                    ejem.setDepartamentoTexto(rs.getString("dptotxt"));
                    ejem.setMunicipioTexto(rs.getString("mpiotxt"));
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return ejem;
    }

    public List<Ejemplar> obtenerEjemplaresPorFamilia(String familia)
    {
        List<Ejemplar> ejemplares = new ArrayList<Ejemplar>();      

        try
        {
            String consulta = consultasSQL.getString("obtenerEjemplaresPorFamilia");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(familia != null && !"".equals(familia))
            {
                cs.setString(1, familia);
            }
            else
            {
                return ejemplares;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while (rs.next())
                {
                    Ejemplar ejem = new Ejemplar();

                    Familia familiadto = new Familia();
                    familiadto.setCodigo(rs.getInt("codigoFamilia"));
                    familiadto.setNombre(rs.getString("nombreFamilia"));
                    familiadto.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    Genero generodto = new Genero();
                    generodto.setCodigo(rs.getInt("codigoGenero"));
                    generodto.setNombre(rs.getString("nombreGenero"));
                    generodto.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    generodto.setFamilia(familiadto);                

                    Especie especiedto = new Especie();
                    especiedto.setCodigo(rs.getInt("codigoEspecie"));
                    especiedto.setNombre(rs.getString("nombreEspecie"));
                    especiedto.setFechaIngreso(rs.getDate("fechaIngresoEspecie"));
                    especiedto.setGenero(generodto);              

                    String autor = rs.getString("nombreautor");
                    String nombreCientifico = rs.getString("nombreGenero") + " " + rs.getString("nombreEspecie") + " " + autor;

                    ejem.setNumero(rs.getInt("NUMERO"));
                    ejem.setFamilia(familiadto);
                    ejem.setGenero(generodto);
                    ejem.setEspecie(especiedto);
                    ejem.setContinente(rs.getInt("continente"));
                    ejem.setPais(rs.getInt("pais"));
                    ejem.setDepartamento(rs.getInt("departamento"));
                    ejem.setMunicipio(rs.getInt("municipio"));
                    ejem.setNombreAutor(autor);
                    ejem.setFechaDeterminacion(rs.getString("fechadeterminacion"));
                    ejem.setNombreDeterminador(rs.getString("nombredeterminador"));
                    ejem.setNombreColectorPrincipal(rs.getString("nombrecolectorppal"));
                    ejem.setNumeroColeccion(rs.getString("numerocoleccion"));
                    ejem.setFechaColeccion(rs.getString("fechacoleccion"));
                    ejem.setNotasCampo(rs.getString("notascampo"));
                    ejem.setSubespecie(rs.getString("subespecie"));
                    ejem.setVariedad(rs.getString("variedad"));
                    ejem.setNombreComun(rs.getString("nombrecomun"));
                    ejem.setNombreCientifico(nombreCientifico);
                    ejem.setLocalidad(rs.getString("localidad"));
                    ejem.setElevacionMinima(rs.getInt("elevacionminima"));
                    ejem.setElevacionMaxima(rs.getInt("elevacionmaxima"));
                    ejem.setGradosLatitud(rs.getDouble("gradoslatitud"));
                    ejem.setMinutosLatitud(rs.getDouble("minutoslatitud"));
                    ejem.setSegundosLatitud(rs.getDouble("segundoslatitud"));
                    ejem.setGradosLongitud(rs.getDouble("gradoslongitud"));
                    ejem.setMinutosLongitud(rs.getDouble("minutoslongitud"));
                    ejem.setSegundosLongitud(rs.getDouble("segundoslongitud"));
                    ejem.setNorteSur(rs.getString("nortesur"));
                    ejem.setEsteOeste(rs.getString("esteoeste"));
                    ejem.setPublicarCoordenadas(rs.getString("publicarcoordenadas"));
                    ejem.setTieneImagen(rs.getString("tieneImagen"));
                    ejem.setPaisTexto(rs.getString("paistxt"));
                    ejem.setDepartamentoTexto(rs.getString("dptotxt"));
                    ejem.setMunicipioTexto(rs.getString("mpiotxt"));

                    ejemplares.add(ejem);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }
        
        return ejemplares;
    }    

    public List<Ejemplar> obtenerEjemplaresPorGenero(String genero)
    {
        List<Ejemplar> ejemplares = new ArrayList<Ejemplar>();

        try
        {
            String consulta = consultasSQL.getString("obtenerEjemplaresPorGenero");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(genero != null && !"".equals(genero))
            {
                cs.setString(1, genero);
            }
            else
            {
                return ejemplares;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while (rs.next())
                {
                    Ejemplar ejem = new Ejemplar();

                    Familia familiadto = new Familia();
                    familiadto.setCodigo(rs.getInt("codigoFamilia"));
                    familiadto.setNombre(rs.getString("nombreFamilia"));
                    familiadto.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    Genero generodto = new Genero();
                    generodto.setCodigo(rs.getInt("codigoGenero"));
                    generodto.setNombre(rs.getString("nombreGenero"));
                    generodto.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    generodto.setFamilia(familiadto);                

                    Especie especiedto = new Especie();
                    especiedto.setCodigo(rs.getInt("codigoEspecie"));
                    especiedto.setNombre(rs.getString("nombreEspecie"));
                    especiedto.setFechaIngreso(rs.getDate("fechaIngresoEspecie"));
                    especiedto.setGenero(generodto);              

                    String autor = rs.getString("nombreautor");
                    String nombreCientifico = rs.getString("nombreGenero") + " " + rs.getString("nombreEspecie") + " " + autor;

                    ejem.setNumero(rs.getInt("numero"));
                    ejem.setFamilia(familiadto);
                    ejem.setGenero(generodto);
                    ejem.setEspecie(especiedto);
                    ejem.setContinente(rs.getInt("continente"));
                    ejem.setPais(rs.getInt("pais"));
                    ejem.setDepartamento(rs.getInt("departamento"));
                    ejem.setMunicipio(rs.getInt("municipio"));
                    ejem.setNombreAutor(autor);
                    ejem.setFechaDeterminacion(rs.getString("fechadeterminacion"));
                    ejem.setNombreDeterminador(rs.getString("nombredeterminador"));
                    ejem.setNombreColectorPrincipal(rs.getString("nombrecolectorppal"));
                    ejem.setNumeroColeccion(rs.getString("numerocoleccion"));
                    ejem.setFechaColeccion(rs.getString("fechacoleccion"));
                    ejem.setNotasCampo(rs.getString("notascampo"));
                    ejem.setSubespecie(rs.getString("subespecie"));
                    ejem.setVariedad(rs.getString("variedad"));
                    ejem.setNombreComun(rs.getString("nombrecomun"));
                    ejem.setNombreCientifico(nombreCientifico);
                    ejem.setLocalidad(rs.getString("localidad"));
                    ejem.setElevacionMinima(rs.getInt("elevacionminima"));
                    ejem.setElevacionMaxima(rs.getInt("elevacionmaxima"));
                    ejem.setGradosLatitud(rs.getDouble("gradoslatitud"));
                    ejem.setMinutosLatitud(rs.getDouble("minutoslatitud"));
                    ejem.setSegundosLatitud(rs.getDouble("segundoslatitud"));
                    ejem.setGradosLongitud(rs.getDouble("gradoslongitud"));
                    ejem.setMinutosLongitud(rs.getDouble("minutoslongitud"));
                    ejem.setSegundosLongitud(rs.getDouble("segundoslongitud"));
                    ejem.setNorteSur(rs.getString("nortesur"));
                    ejem.setEsteOeste(rs.getString("esteoeste"));
                    ejem.setPublicarCoordenadas(rs.getString("publicarcoordenadas"));
                    ejem.setTieneImagen(rs.getString("tieneImagen"));
                    ejem.setPaisTexto(rs.getString("paistxt"));
                    ejem.setDepartamentoTexto(rs.getString("dptotxt"));
                    ejem.setMunicipioTexto(rs.getString("mpiotxt"));

                    ejemplares.add(ejem);
                }
            }            

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }
        
        return ejemplares;
    }

    public List<Ejemplar> obtenerEjemplaresPorNombreCientifico(String nombreCientifico)
    {
        List<Ejemplar> ejemplares = new ArrayList<Ejemplar>();

        try
        {
            String consulta = consultasSQL.getString("obtenerEjemplaresPorNombreCientifico");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(nombreCientifico != null && !"".equals(nombreCientifico))
            {
                cs.setString(1, nombreCientifico);
            }
            else
            {
                return ejemplares;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while (rs.next())
                {
                    Ejemplar ejem = new Ejemplar();

                    Familia familiadto = new Familia();
                    familiadto.setCodigo(rs.getInt("codigoFamilia"));
                    familiadto.setNombre(rs.getString("nombreFamilia"));
                    familiadto.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    Genero generodto = new Genero();
                    generodto.setCodigo(rs.getInt("codigoGenero"));
                    generodto.setNombre(rs.getString("nombreGenero"));
                    generodto.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    generodto.setFamilia(familiadto);                

                    Especie especiedto = new Especie();
                    especiedto.setCodigo(rs.getInt("codigoEspecie"));
                    especiedto.setNombre(rs.getString("nombreEspecie"));
                    especiedto.setFechaIngreso(rs.getDate("fechaIngresoEspecie"));
                    especiedto.setGenero(generodto);              

                    String autor = rs.getString("nombreautor");
                    String nomCientifico = rs.getString("nombreGenero") + " " + rs.getString("nombreEspecie") + " " + autor;

                    ejem.setNumero(rs.getInt("numero"));
                    ejem.setFamilia(familiadto);
                    ejem.setGenero(generodto);
                    ejem.setEspecie(especiedto);
                    ejem.setContinente(rs.getInt("continente"));
                    ejem.setPais(rs.getInt("pais"));
                    ejem.setDepartamento(rs.getInt("departamento"));
                    ejem.setMunicipio(rs.getInt("municipio"));
                    ejem.setNombreAutor(autor);
                    ejem.setFechaDeterminacion(rs.getString("fechadeterminacion"));
                    ejem.setNombreDeterminador(rs.getString("nombredeterminador"));
                    ejem.setNombreColectorPrincipal(rs.getString("nombrecolectorppal"));
                    ejem.setNumeroColeccion(rs.getString("numerocoleccion"));
                    ejem.setFechaColeccion(rs.getString("fechacoleccion"));
                    ejem.setNotasCampo(rs.getString("notascampo"));
                    ejem.setSubespecie(rs.getString("subespecie"));
                    ejem.setVariedad(rs.getString("variedad"));
                    ejem.setNombreComun(rs.getString("nombrecomun"));
                    ejem.setNombreCientifico(nomCientifico);
                    ejem.setLocalidad(rs.getString("localidad"));
                    ejem.setElevacionMinima(rs.getInt("elevacionminima"));
                    ejem.setElevacionMaxima(rs.getInt("elevacionmaxima"));
                    ejem.setGradosLatitud(rs.getDouble("gradoslatitud"));
                    ejem.setMinutosLatitud(rs.getDouble("minutoslatitud"));
                    ejem.setSegundosLatitud(rs.getDouble("segundoslatitud"));
                    ejem.setGradosLongitud(rs.getDouble("gradoslongitud"));
                    ejem.setMinutosLongitud(rs.getDouble("minutoslongitud"));
                    ejem.setSegundosLongitud(rs.getDouble("segundoslongitud"));
                    ejem.setNorteSur(rs.getString("nortesur"));
                    ejem.setEsteOeste(rs.getString("esteoeste"));
                    ejem.setPublicarCoordenadas(rs.getString("publicarcoordenadas"));
                    ejem.setTieneImagen(rs.getString("tieneImagen"));
                    ejem.setPaisTexto(rs.getString("paistxt"));
                    ejem.setDepartamentoTexto(rs.getString("dptotxt"));
                    ejem.setMunicipioTexto(rs.getString("mpiotxt"));

                    ejemplares.add(ejem);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }
        
        return ejemplares;
    }

    public List<Ejemplar> obtenerEjemplaresPorEspecie(String especie)
    {
        List<Ejemplar> ejemplares = new ArrayList<Ejemplar>();

        try
        {
            String consulta = consultasSQL.getString("obtenerEjemplaresPorEspecie");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(especie != null && !"".equals(especie))
            {
                cs.setString(1, especie);
            }
            else
            {
                return ejemplares;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while (rs.next())
                {
                    Ejemplar ejem = new Ejemplar();

                    Familia familiadto = new Familia();
                    familiadto.setCodigo(rs.getInt("codigoFamilia"));
                    familiadto.setNombre(rs.getString("nombreFamilia"));
                    familiadto.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    Genero generodto = new Genero();
                    generodto.setCodigo(rs.getInt("codigoGenero"));
                    generodto.setNombre(rs.getString("nombreGenero"));
                    generodto.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    generodto.setFamilia(familiadto);                

                    Especie especiedto = new Especie();
                    especiedto.setCodigo(rs.getInt("codigoEspecie"));
                    especiedto.setNombre(rs.getString("nombreEspecie"));
                    especiedto.setFechaIngreso(rs.getDate("fechaIngresoEspecie"));
                    especiedto.setGenero(generodto);              

                    String autor = rs.getString("nombreautor");
                    String nomCientifico = rs.getString("nombreGenero") + " " + rs.getString("nombreEspecie") + " " + autor;

                    ejem.setNumero(rs.getInt("numero"));
                    ejem.setFamilia(familiadto);
                    ejem.setGenero(generodto);
                    ejem.setEspecie(especiedto);
                    ejem.setContinente(rs.getInt("continente"));
                    ejem.setPais(rs.getInt("pais"));
                    ejem.setDepartamento(rs.getInt("departamento"));
                    ejem.setMunicipio(rs.getInt("municipio"));
                    ejem.setNombreAutor(autor);
                    ejem.setFechaDeterminacion(rs.getString("fechadeterminacion"));
                    ejem.setNombreDeterminador(rs.getString("nombredeterminador"));
                    ejem.setNombreColectorPrincipal(rs.getString("nombrecolectorppal"));
                    ejem.setNumeroColeccion(rs.getString("numerocoleccion"));
                    ejem.setFechaColeccion(rs.getString("fechacoleccion"));
                    ejem.setNotasCampo(rs.getString("notascampo"));
                    ejem.setSubespecie(rs.getString("subespecie"));
                    ejem.setVariedad(rs.getString("variedad"));
                    ejem.setNombreComun(rs.getString("nombrecomun"));
                    ejem.setNombreCientifico(nomCientifico);
                    ejem.setLocalidad(rs.getString("localidad"));
                    ejem.setElevacionMinima(rs.getInt("elevacionminima"));
                    ejem.setElevacionMaxima(rs.getInt("elevacionmaxima"));
                    ejem.setGradosLatitud(rs.getDouble("gradoslatitud"));
                    ejem.setMinutosLatitud(rs.getDouble("minutoslatitud"));
                    ejem.setSegundosLatitud(rs.getDouble("segundoslatitud"));
                    ejem.setGradosLongitud(rs.getDouble("gradoslongitud"));
                    ejem.setMinutosLongitud(rs.getDouble("minutoslongitud"));
                    ejem.setSegundosLongitud(rs.getDouble("segundoslongitud"));
                    ejem.setNorteSur(rs.getString("nortesur"));
                    ejem.setEsteOeste(rs.getString("esteoeste"));
                    ejem.setPublicarCoordenadas(rs.getString("publicarcoordenadas"));
                    ejem.setTieneImagen(rs.getString("tieneImagen"));
                    ejem.setPaisTexto(rs.getString("paistxt"));
                    ejem.setDepartamentoTexto(rs.getString("dptotxt"));
                    ejem.setMunicipioTexto(rs.getString("mpiotxt"));

                    ejemplares.add(ejem);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }
        
        return ejemplares;
    }

    public List<Ejemplar> obtenerListaEjemplares(String familia, String genero, String nombreCientifico,
            String colectorPrincipal, String numeroColeccion, String codigoBarras,int pais, int departamento,
            int municipio)
    {
        List<Ejemplar> ejemplares = new ArrayList<Ejemplar>();

        try
        {
            //Obtengo la consulta sql
            String consulta = consultasSQL.getString("obtenerEjemplaresBusquedaAvanzada");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            /*** Se valida que los parametros de la busqueda sean diferentes de nulo o vacio
             * Para poder añadirlos a la consulta sql
             */
			if(familia != null && !"".equals(familia))
			{
                cs.setString(1, familia);
			}
            else
            {
                cs.setString(1, null);
            }

            if(genero != null && !"".equals(genero))
			{
                cs.setString(2, genero);
			}
            else
            {
                cs.setString(2, null);
            }

            if(nombreCientifico != null && !"".equals(nombreCientifico))
			{
                cs.setString(3, nombreCientifico);
			}
            {
                cs.setString(3, null);
            }

            if(colectorPrincipal != null && !"".equals(colectorPrincipal))
			{
                cs.setString(4, colectorPrincipal);
			}
            else
            {
                cs.setString(4, null);
            }

            if(numeroColeccion != null && !"".equals(numeroColeccion))
			{
				cs.setString(5, numeroColeccion);
			}
            else
            {
                cs.setString(5, null);
            }

            if(codigoBarras != null && !"".equals(codigoBarras))
			{
				cs.setString(6, codigoBarras);
			}
            else
            {
                cs.setString(6, null);
            }

            if(pais > 0)
			{
				cs.setInt(7, pais);
			}
            else
            {
                cs.setInt(7, -1);
            }

            if(departamento > 0)
			{
				cs.setInt(8, departamento);
			}
            else
            {
                cs.setInt(8, -1);
            }

            if(municipio > 0)
			{
				cs.setInt(9, municipio);
			}
            else
            {
                cs.setInt(9, -1);
            }

            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while (rs.next())
                {
                    Ejemplar ejem = new Ejemplar();

                    Familia familiadto = new Familia();
                    familiadto.setCodigo(rs.getInt("codigoFamilia"));
                    familiadto.setNombre(rs.getString("nombreFamilia"));
                    familiadto.setFechaIngreso(rs.getDate("fechaIngresoFamilia"));

                    Genero generodto = new Genero();
                    generodto.setCodigo(rs.getInt("codigoGenero"));
                    generodto.setNombre(rs.getString("nombreGenero"));
                    generodto.setFechaIngreso(rs.getDate("fechaIngresoGenero"));
                    generodto.setFamilia(familiadto);

                    Especie especiedto = new Especie();
                    especiedto.setCodigo(rs.getInt("codigoEspecie"));
                    especiedto.setNombre(rs.getString("nombreEspecie"));
                    especiedto.setFechaIngreso(rs.getDate("fechaIngresoEspecie"));
                    especiedto.setGenero(generodto);

                    String autor = rs.getString("nombreautor");
                    String nomCientifico = rs.getString("nombreGenero") + " " + rs.getString("nombreEspecie") + " " + autor;

                    ejem.setNumero(rs.getInt("numero"));
                    ejem.setFamilia(familiadto);
                    ejem.setGenero(generodto);
                    ejem.setEspecie(especiedto);
                    ejem.setContinente(rs.getInt("continente"));
                    ejem.setPais(rs.getInt("pais"));
                    ejem.setDepartamento(rs.getInt("departamento"));
                    ejem.setMunicipio(rs.getInt("municipio"));
                    ejem.setNombreAutor(autor);
                    ejem.setFechaDeterminacion(rs.getString("fechadeterminacion"));
                    ejem.setNombreDeterminador(rs.getString("nombredeterminador"));
                    ejem.setNombreColectorPrincipal(rs.getString("nombrecolectorppal"));
                    ejem.setNumeroColeccion(rs.getString("numerocoleccion"));
                    ejem.setFechaColeccion(rs.getString("fechacoleccion"));
                    ejem.setNotasCampo(rs.getString("notascampo"));
                    ejem.setSubespecie(rs.getString("subespecie"));
                    ejem.setVariedad(rs.getString("variedad"));
                    ejem.setNombreComun(rs.getString("nombrecomun"));
                    ejem.setNombreCientifico(nomCientifico);
                    ejem.setLocalidad(rs.getString("localidad"));
                    ejem.setElevacionMinima(rs.getInt("elevacionminima"));
                    ejem.setElevacionMaxima(rs.getInt("elevacionmaxima"));
                    ejem.setGradosLatitud(rs.getDouble("gradoslatitud"));
                    ejem.setMinutosLatitud(rs.getDouble("minutoslatitud"));
                    ejem.setSegundosLatitud(rs.getDouble("segundoslatitud"));
                    ejem.setGradosLongitud(rs.getDouble("gradoslongitud"));
                    ejem.setMinutosLongitud(rs.getDouble("minutoslongitud"));
                    ejem.setSegundosLongitud(rs.getDouble("segundoslongitud"));
                    ejem.setNorteSur(rs.getString("nortesur"));
                    ejem.setEsteOeste(rs.getString("esteoeste"));
                    ejem.setPublicarCoordenadas(rs.getString("publicarcoordenadas"));
                    ejem.setTieneImagen(rs.getString("tieneImagen"));
                    ejem.setPaisTexto(rs.getString("paistxt"));
                    ejem.setDepartamentoTexto(rs.getString("dptotxt"));
                    ejem.setMunicipioTexto(rs.getString("mpiotxt"));

                    ejemplares.add(ejem);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return ejemplares;
    }

    public List<String> obtenerNombresCientificos(String valor)
    {
        List<String> nombresCientificos = new ArrayList<String>();

        try
        {
            String consulta = consultasSQL.getString("obtenerNombresCientificos");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(valor != null && !"".equals(valor))
            {
                cs.setString(1, valor);
            }
            else
            {
                return nombresCientificos;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    String nomGenero = rs.getString("genero");
                    String nomEspecie = rs.getString("especie");
                    String nombreCientifico = nomGenero + " " + nomEspecie;
                    nombresCientificos.add(nombreCientifico);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return nombresCientificos;
    }

    public int crearEjemplar(Ejemplar ejemplar)
    {
        int res = 1;
        return res;
    }

    public int actualizarEjemplar(Ejemplar ejemplar)
    {
        int res = 1;
        return res;
    }
}
